
#异常、异常处理、模块、包

#异常：是一个事件，这个事件在程序执行过程中发生，影响程序的正常执行。

#异常处理：让程序存在异常时，仍能够正常运行。
#异常处理格式一：try: …… except: ……
try:
    print(a)
except:
    print('出现错误')
b=10
print(b)
print('\n')

#万能异常Exception，可以捕获任意形式的异常
try:
    print(a)
except Exception as e:  #把异常命名为e
    print(e)
print('\n')



#异常处理格式二：Try: …… except: …… else: ……
#else 只有在没有异常时才会执行的代码，可以把except理解为if
dic = {'name':'zs'}
try:
    print(dic['age'])
except Exception:
    print('出现错误')
else:
    print('没有捕获到异常')  #出现错误不会被执行
print('\n')


#异常处理格式三
#try: 
    #可能引发异常的代码
#except:
    #出现异常现象的处理代码
#finally:
    #try代码块结束后运行的代码（无论有没有异常，都会执行）
try:
    print(a)
except NameError:
    print('出现错误')
finally:
    print('无论有无错误，始终会被执行。')
print('\n')


#异常处理格式四：（完整版）
#try:      （必选）
    #可能引发异常的代码
#except:   （except和finally二选一）
    #出现异常的处理代码
#else:      （可选）
    #未出现异常的处理代码
#finally:
    #try代码块结束后运行的代码（无论有没有异常，都会执行）
'''
try:
    x = int(input('请输入一个整数：'))
    print(10/x)
except ValueError:
    print('请输入正确的数据')
except Exception as e:
    print('未知错误 %s'%e)
else:
    print('没有异常时才会执行的代码')
finally:
    print('无论有无异常，都会执行的代码')
print('\n')   
'''


#异常的传递
#当函数、方法执行出现异常，会将异常传递给 函数、方法的调用一方。
#如果传递到主程序，仍然没有异常处理，程序才会被终止。
#在主函数中设置“异常捕获”机制，调用子函数
#例子1
'''
def funa():  #子函数
    return int(input('请输入整数'))
def funb():  #主函数
    return funa()
try:
    print(funb())  #在主函数中增加异常捕获
except Exception as e:
    print('错误:%s' %e)
'''


#抛出异常：主动触发异常现象
#raise 异常类对象
#1.创建一个Exception('……')的对象    (……为异常提示信息)
#2.raise 抛出这个对象
#例子1
"""
def funa():
    raise Exception('抛出一个异常')
    print('哈哈哈')
funa()
"""

#例子2
def user():
    pwd = input('请输入密码：')
    if len(pwd)>=6:
        return pwd
    #创建一个异常对象
    ex = Exception('密码长度不够')
    raise ex
try:
    upwd = user()   #函数的返回值会返回到函数的调用处
    print(upwd)
except Exception as e:
    print('错误:%s'%e)
print('\n')


    


